# -*- coding:utf-8 -*-

# @Time : 2023/8/7 17:09
# @Author : 快乐的小猴子
# @Version : 
# @Function : 


import requests
from KfcAddress import settings
import os


def get_addr():
    """
    获取用户输入的地址信息
    :return: 地址
    """
    addr = input('请输入要查询的城市(q/Q退出)：')
    return addr


def send(addr, pageIndex=1):
    """
    发送请求，获取返回数据
    :param addr: 地址
    :param pageIndex: 第n页
    :return:
    """
    settings.data['keyword'] = addr
    settings.data['pageIndex'] = pageIndex
    resp = requests.post(url=settings.url, data=settings.data, headers=settings.headers).json()
    return resp


def get_tot_pages(resp):
    """
    获取总共多少页数据
    :param resp: 服务器响应回的数据
    :return: 总页数
    """
    total_cnt = int(resp['Table'][0]['rowcount'])
    if total_cnt % 10 == 0:
        page_cnts = int(total_cnt / len(resp['Table1']))
    else:
        page_cnts = int(total_cnt / len(resp['Table1'])) + 1
    return page_cnts


def get_all_datas(page_cnts, addr):
    """
    获取所有的数据信息
    :param page_cnts: 总页数
    :param addr: 地址信息
    :return: 所有的数据信息
    """
    all_data_list = []
    num = 0
    for i in range(1, page_cnts + 1):
        resp = send(addr, i)
        for j in range(0, len(resp['Table1'])):
            storeName = resp['Table1'][j]['storeName']  # 餐厅名称
            addressDetail = resp['Table1'][j]['addressDetail']  # 餐厅地址
            num += 1
            all_data_list.append((storeName, addressDetail))
    return all_data_list


def verf_dir():
    """
    校验路径是否存在，若不存在则新建
    :return: 创建的文件路径
    """
    path = os.getcwd() + '\\files\\'
    if not os.path.exists(path):
        print('文件路径不存在！！！')
        os.makedirs(path)
        print('保存数据文件路径创建成功~~~')
    else:
        print('保存文件路径已存在~~~')
    return path


def get_file_addr(path):
    """
    获取所有数据文件的地址信息
    :param path: 文件路径
    :return: 文件中已存在的城市
    """
    addr_list = []
    with open(path + 'KFC餐厅地址信息.txt', 'r', encoding='utf-8') as fs:
        line_datas = fs.readlines()
        for i in range(0, len(line_datas)):
            if '】：' in line_datas[i].strip():
                comp_data = line_datas[i].strip()[1:].split('】')[0]
                addr_list.append(comp_data)
    return addr_list


def save(path, all_data_list, addr, *args):
    """
    保存爬取的数据
    :return:
    """
    # 判断入参：若文件中已存在部分城市KFC的地址信息，进行删选，这部分城市的数据不需保存到文件
    if args:
        with open(path + 'KFC餐厅地址信息.txt', 'a', encoding='utf-8') as fp:
            print('目前文件中已存在KFC地址信息的城市：{}'.format('、'.join(args[0])))
            if addr.strip() in args[0]:
                print('%s地址信息已经存在！！！' % addr)
            else:
                fp.write('【{}】：\n餐厅名称 餐厅地址\n'.format(addr))
                for i in range(0, len(all_data_list)):
                    storeName = all_data_list[i][0]
                    addressDetail = all_data_list[i][1]
                    fp.write(str(i + 1) + storeName + '餐厅 ' + addressDetail + '\n')
                print('{}地址信息保存完成~~~'.format(addr))
    else:
        with open(path + 'KFC餐厅地址信息.txt', 'a', encoding='utf-8') as fp:
            fp.write('【{}】：\n餐厅名称 餐厅地址\n'.format(addr))
            for i in range(0, len(all_data_list)):
                storeName = all_data_list[i][0]
                addressDetail = all_data_list[i][1]
                fp.write(str(i + 1) + storeName + '餐厅 ' + addressDetail + '\n')
            print('{}地址信息保存完成~~~'.format(addr))


def main():
    path = verf_dir()
    while True:
        addr = get_addr()
        if addr.strip().upper() == 'Q':
            break
        # 检查文件路径是否存在txt文件，不存在则创建后在进行数据爬取
        if os.path.exists(path + 'KFC餐厅地址信息.txt'):
            addr_list = get_file_addr(path)
            resp = send(addr)
            page_cnts = get_tot_pages(resp)
            all_data_list = get_all_datas(page_cnts, addr)
            save(path, all_data_list, addr, addr_list)
        else:
            resp = send(addr)
            page_cnts = get_tot_pages(resp)
            all_data_list = get_all_datas(page_cnts, addr)
            save(path, all_data_list, addr)


if __name__ == '__main__':
    main()
